package com.zrrd.yunchmall.study.redis;

import org.junit.Before;
import org.junit.Test;
import org.springframework.boot.test.context.SpringBootTest;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPubSub;

import java.util.List;
import java.util.concurrent.TimeUnit;

@SpringBootTest
public class RedisTest1 {
    //专门用于在java程序里访问redis服务
    private Jedis jedis;

    @Before
    public void init() {
        // 注意：如果使用docker启动的redis，ip要换成你的虚拟机ip
//        jedis = new Jedis("127.0.0.1", 6379);
        jedis = new Jedis("192.168.0.109", 6379);
        jedis.auth("root");
//        jedis.select(0);
    }

    @Test
    public void testPing() {
//        String msg = jedis.ping("hello redis");
        String msg = jedis.ping();
        System.out.println(msg);
    }

    //测试1：操作string类型
    @Test
    public void testString() {
        jedis.set("msg", "你是一个好人！");
//        jedis.set("msg", "hello");
        jedis.append("msg", "但是，我们不合适！");
        jedis.expire("msg", 30);//30s后这个key将被移除
        if (jedis.exists("msg")) {//判断key是否存在
            String val = jedis.get("msg");
            System.out.println(val);
        }
        System.out.println("OK");
    }

    //测试2：操作list类型
    @Test
    public void testList() {
        //从左侧添加到列表
        jedis.lpush("cities3", "双城");
        jedis.lpush("cities3", "巴彦");
        jedis.lpush("cities3", "邢台");
        //从右侧添加到列表
        jedis.rpush("cities3", "绥化");
        jedis.rpush("cities3", "NewYork");
        jedis.rpush("cities3", "London");
        System.out.println("列表cities的长度：" + jedis.llen("cities3"));
        List<String> cities = jedis.lrange("cities3", 0, -1);
        cities.forEach(item -> {
            System.out.println(item);
        });
        System.out.println("OK");
    }

    //测试3：操作Set类型
    @Test
    public void testSet() {
        jedis.sadd("fruits", "香蕉", "苹果", "鸭梨", "火龙果", "榴莲", "芒果");
        jedis.sadd("fruits", "苹果");
        long n = jedis.scard("fruits");
        System.out.println("集合中一共有" + n + "个元素");
        jedis.smembers("fruits").forEach(item -> {
            System.out.println(item);
        });
    }
    //测试4：操作ZSet类型
    @Test
    public void testZSet() {
        jedis.zadd("scoreOfLfh", 46, "数据结构");
        jedis.zadd("scoreOfLfh", 60, "计算机组成原理");
        jedis.zadd("scoreOfLfh", 78, "大学外语");
        jedis.zadd("scoreOfLfh", 60, "复变函数");
        //取出当前key对应的zset一共有几个元素
        long total = jedis.zcard("scoreOfLfh");
        System.out.printf("李丰昊今年一共考了%d个科目\n", total);
        System.out.println("分别是：");
        jedis.zrange("scoreOfLfh", 0, -1).forEach(item -> {
            System.out.println(item);
        });
        long n = jedis.zcount("scoreOfLfh", 0, 59);
        System.out.printf("李丰昊一共挂了%d科\n", n);

    }

    //测试5：hash类型
    @Test
    public void testHash() {
        jedis.hset("LiFengHao", "name", "李丰昊");
        jedis.hset("LiFengHao", "age", "21");
        jedis.hset("LiFengHao", "birthday", "2003-01-05");
        jedis.hset("LiFengHao", "star", "水瓶座");
        if (!jedis.hexists("LiFengHao", "star")) {
            jedis.hset("LiFengHao", "star", "天秤座");
        }
        // 如果对应key的某个filed未设置，则设置对应的value
        jedis.hsetnx("LiFengHao", "star", "金牛座");
        jedis.hkeys("LiFengHao").forEach(key -> {
            // 遍历输出李丰昊的全部信息
            System.out.println(jedis.hget("LiFengHao", key));
        });
        //返回hash对象的全部信息
        System.out.println(jedis.hgetAll("LiFengHao"));
    }

    // 订阅redis中的频道，接收（消费）异步消息
    @Test
    public void test06() throws InterruptedException {
        jedis.subscribe(new JedisPubSub() {
            @Override
            public void onMessage(String channel, String message) {
                System.out.println("接收消息：" + message + "，来自于频道：" + channel);
            }
        }, "LiYe", "TaLa", "JoeZhou");
        System.out.println("等待大家的消息中...");
        // 睡眠1分钟
        TimeUnit.MINUTES.sleep(10);
    }
    //使用redis发布(生产)消息
    @Test
    public void test07() {
        jedis.publish("LiYe", "祝大家新年快乐！");
    }


}
